#!/bin/bash
# ============================================================================
# 修复 CentOS 7.9 yum 与 Python 3 冲突问题
# ============================================================================
#
# 问题描述：
#   在 CentOS 7.9 上，如果将系统默认 Python 从 2.7 改为 3.x，
#   yum 会报错：SyntaxError: invalid syntax (except KeyboardInterrupt, e:)
#
# 原因：
#   yum 及其相关工具依赖 Python 2.7，使用 Python 3 会因语法不兼容而失败
#
# 解决方案：
#   修改 yum 相关脚本的 shebang 行，明确指定使用 Python 2.7
#
# 使用方法：
#   sudo ./ci/fix-yum-python.sh
#
# ============================================================================

set -e
set -u

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
    log_error "此脚本需要 root 权限"
    log_info "请使用: sudo $0"
    exit 1
fi

# 检查系统类型
if [ ! -f /etc/redhat-release ]; then
    log_error "此脚本仅适用于 CentOS/RHEL 系统"
    exit 1
fi

log_info "=========================================="
log_info "修复 CentOS 7.9 yum 与 Python 3 冲突"
log_info "=========================================="

# 检查 Python 2.7 是否存在
PYTHON2_PATH=""
if command -v python2.7 &> /dev/null; then
    PYTHON2_PATH=$(which python2.7)
elif [ -f /usr/bin/python2.7 ]; then
    PYTHON2_PATH="/usr/bin/python2.7"
elif [ -f /usr/bin/python2 ]; then
    PYTHON2_PATH="/usr/bin/python2"
else
    log_error "未找到 Python 2.7"
    log_info ""
    log_info "Python 2.7 已被删除，需要先恢复 Python 2.7"
    log_info ""
    log_info "请运行恢复脚本："
    log_info "  sudo ./ci/restore-python27.sh"
    log_info ""
    log_info "或者手动安装："
    log_info "  # 如果 yum 可用"
    log_info "  sudo yum install -y python2 python2-devel"
    log_info ""
    log_info "  # 如果 yum 不可用，需要先修复 yum 或使用 rpm 直接安装"
    exit 1
fi

log_success "找到 Python 2.7: ${PYTHON2_PATH}"

# 需要修复的文件列表
FILES_TO_FIX=(
    "/usr/bin/yum"
    "/usr/libexec/urlgrabber-ext-down"
)

# 检查并修复文件
FIXED_COUNT=0
for file in "${FILES_TO_FIX[@]}"; do
    if [ ! -f "$file" ]; then
        log_warning "文件不存在，跳过: $file"
        continue
    fi
    
    log_info "检查文件: $file"
    
    # 读取第一行（shebang）
    FIRST_LINE=$(head -n 1 "$file")
    
    # 检查是否需要修复
    if echo "$FIRST_LINE" | grep -q "^#!/usr/bin/python$"; then
        log_info "  发现需要修复的 shebang: $FIRST_LINE"
        
        # 备份原文件
        BACKUP_FILE="${file}.backup.$(date +%Y%m%d_%H%M%S)"
        cp "$file" "$BACKUP_FILE"
        log_info "  已备份到: $BACKUP_FILE"
        
        # 替换 shebang
        sed -i "1s|^#!/usr/bin/python$|#!${PYTHON2_PATH}|" "$file"
        log_success "  已修复: $file"
        FIXED_COUNT=$((FIXED_COUNT + 1))
    elif echo "$FIRST_LINE" | grep -q "^#!/usr/bin/python3"; then
        log_info "  发现 Python 3 shebang: $FIRST_LINE"
        
        # 备份原文件
        BACKUP_FILE="${file}.backup.$(date +%Y%m%d_%H%M%S)"
        cp "$file" "$BACKUP_FILE"
        log_info "  已备份到: $BACKUP_FILE"
        
        # 替换 shebang
        sed -i "1s|^#!/usr/bin/python3.*|#!${PYTHON2_PATH}|" "$file"
        log_success "  已修复: $file"
        FIXED_COUNT=$((FIXED_COUNT + 1))
    elif echo "$FIRST_LINE" | grep -q "^#!${PYTHON2_PATH}"; then
        log_info "  已经是正确的 Python 2.7 shebang，无需修复"
    elif echo "$FIRST_LINE" | grep -q "^#!/usr/bin/python2"; then
        log_info "  已经是 Python 2 shebang，无需修复"
    else
        log_warning "  未识别的 shebang: $FIRST_LINE"
        log_warning "  如果 yum 仍然报错，可能需要手动修复此文件"
    fi
done

# 检查 yum 相关的其他 Python 文件
log_info "检查其他 yum 相关的 Python 文件..."
YUM_PYTHON_FILES=$(find /usr/libexec -name "*.py" -type f 2>/dev/null | grep -E "(yum|urlgrabber)" || true)

if [ -n "$YUM_PYTHON_FILES" ]; then
    while IFS= read -r file; do
        if [ -f "$file" ]; then
            FIRST_LINE=$(head -n 1 "$file")
            if echo "$FIRST_LINE" | grep -q "^#!/usr/bin/python$" || \
               echo "$FIRST_LINE" | grep -q "^#!/usr/bin/python3"; then
                log_info "  发现需要修复的文件: $file"
                
                # 备份
                BACKUP_FILE="${file}.backup.$(date +%Y%m%d_%H%M%S)"
                cp "$file" "$BACKUP_FILE"
                
                # 修复
                if echo "$FIRST_LINE" | grep -q "^#!/usr/bin/python$"; then
                    sed -i "1s|^#!/usr/bin/python$|#!${PYTHON2_PATH}|" "$file"
                else
                    sed -i "1s|^#!/usr/bin/python3.*|#!${PYTHON2_PATH}|" "$file"
                fi
                
                log_success "  已修复: $file"
                FIXED_COUNT=$((FIXED_COUNT + 1))
            fi
        fi
    done <<< "$YUM_PYTHON_FILES"
fi

# 验证修复
log_info "=========================================="
log_info "验证修复结果..."
log_info "=========================================="

if [ "$FIXED_COUNT" -gt 0 ]; then
    log_success "已修复 $FIXED_COUNT 个文件"
    
    # 测试 yum 是否正常工作
    log_info "测试 yum 命令..."
    if yum --version &> /dev/null; then
        log_success "✅ yum 命令正常工作"
        log_info "yum 版本信息:"
        yum --version | head -n 1
    else
        log_error "❌ yum 命令仍然无法正常工作"
        log_info "请检查错误信息并手动修复"
        exit 1
    fi
else
    log_info "未发现需要修复的文件"
    log_info "如果 yum 仍然报错，请检查："
    log_info "  1. Python 2.7 是否正确安装"
    log_info "  2. yum 相关文件的权限是否正确"
    log_info "  3. 是否有其他 Python 脚本需要修复"
fi

log_info "=========================================="
log_success "修复完成！"
log_info "=========================================="
log_info ""
log_info "提示："
log_info "  - 备份文件保存在原文件同目录，文件名格式: *.backup.YYYYMMDD_HHMMSS"
log_info "  - 如需恢复，请使用备份文件覆盖原文件"
log_info "  - 建议保留 Python 2.7 和 Python 3 共存，使用 python3 命令调用 Python 3"
log_info ""

